/*
 * MIT许可证
 *
 * 版权所有 (c) 2025-2035 JacobGreen
 *
 * 特此免费授予获得本软件及相关文档文件（"软件"）副本的任何人不受限制地处置该软件的权利，
 * 包括不限于使用、复制、修改、合并、发布、分发、再许可和/或出售该软件副本，
 * 以及允许被提供该软件的人这样做，须遵守以下条件：
 *
 * 上述版权声明和本许可声明应包含在该软件的所有副本或实质性部分中。
 *
 * 本软件按"原样"提供，不附带任何形式的明示或暗示的保证，
 * 包括但不限于对适销性、特定用途适用性和不侵权的保证。
 * 在任何情况下，作者或版权持有人均不对任何索赔、损害或其他
 * 责任负责，无论是在合同行为、侵权行为或其他方面，
 * 与软件或软件的使用或其他交易有关。
 */

/**
 * filename:Log.h
 * description:是日志系统的API接口
 */
#ifndef _LOG_H_
#define _LOG_H_

#include <stdbool.h>

/**
 * 日志级别枚举
 */
typedef enum {
    LOG_DEBUG = 0,  // 调试级别
    LOG_INFO = 1,   // 信息级别
    LOG_WARN = 2,   // 警告级别
    LOG_ERROR = 3   // 错误级别
} LogLevel;

/**
 * <p>
 * 初始化日志系统
 * </p>
 * 
 * @return 成功返回SUCCESS，失败返回FAIL
 */
bool logInit();

/**
 * <p>
 * 设置全局日志级别
 * </p>
 * 
 * @param level 日志级别
 */
void setLogLevel(LogLevel level);

/**
 * <p>
 * 从命令行参数设置日志合并模式
 * </p>
 * 
 * @param argc 参数数量
 * @param argv 参数列表(字符串数组)
 */
void setLogMergeFromArgs(int argc, char *argv[]);

/**
 * <p>
 * 从命令行参数设置日志级别
 * </p>
 * 
 * @param argc 参数数量
 * @param argv 参数列表(字符串数组)
 */
void setLogLevelFromArgs(int argc, char *argv[]);

/**
 * <p>
 * 关闭日志系统，释放资源
 * </p>
 */
void logClose();

/**
 * <p>
 * 打印调试日志
 * </p>
 * 
 * @param module 模块名称
 * @param function 功能名称
 * @param file 源文件名称
 * @param line 行号
 * @param format 格式化字符串
 * @param ... 可变参数
 */
void logDebug(const char *module, const char *function, const char *file, int line, const char *format, ...);

/**
 * <p>
 * 打印信息日志
 * </p>
 * 
 * @param module 模块名称
 * @param function 功能名称
 * @param file 源文件名称
 * @param line 行号
 * @param format 格式化字符串
 * @param ... 可变参数
 */
void logInfo(const char *module, const char *function, const char *file, int line, const char *format, ...);

/**
 * <p>
 * 打印警告日志
 * </p>
 * 
 * @param module 模块名称
 * @param function 功能名称
 * @param file 源文件名称
 * @param line 行号
 * @param format 格式化字符串
 * @param ... 可变参数
 */
void logWarn(const char *module, const char *function, const char *file, int line, const char *format, ...);

/**
 * <p>
 * 打印错误日志
 * </p>
 * 
 * @param module 模块名称
 * @param function 功能名称
 * @param file 源文件名称
 * @param line 行号
 * @param format 格式化字符串
 * @param ... 可变参数
 */
void logError(const char *module, const char *function, const char *file, int line, const char *format, ...);

// 宏定义，方便使用，自动填充文件和行号
#define LOG_DEBUG(module, function, format, ...) logDebug(module, function, __FILE__, __LINE__, format, ##__VA_ARGS__)
#define LOG_INFO(module, function, format, ...) logInfo(module, function, __FILE__, __LINE__, format, ##__VA_ARGS__)
#define LOG_WARN(module, function, format, ...) logWarn(module, function, __FILE__, __LINE__, format, ##__VA_ARGS__)
#define LOG_ERROR(module, function, format, ...) logError(module, function, __FILE__, __LINE__, format, ##__VA_ARGS__)

#endif // _LOG_H_